-- function average(...)
--     result = 0
--     local arg={...}    --> arg 为一个表，局部变量
--     for i,v in ipairs(arg) do
--        result = result + v
--     end
--     print("总共传入 " .. #arg .. " 个数")
--     return result/#arg
--  end

--  print("平均值为",average(10,5,3,4,5,6))
-- function square(iteratorMaxCount, currentNumber)
--     if currentNumber < iteratorMaxCount
--     then
--         currentNumber = currentNumber + 1
--         return currentNumber, currentNumber * currentNumber
--     end
-- end

-- for i, n in square, 3, 0 do
--     print(i, n)
-- end
-- array = { "Google", "Runoob" }

-- function elementIterator(collection)
--     local index = 0
--     local count = #collection
--     -- 闭包函数
--     return function()
--         index = index + 1
--         if index <= count
--         then
--             --  返回迭代器的当前元素
--             return collection[index]
--         end
--     end
-- end

-- for element in elementIterator(array) do
--     print(element)
-- end


-- function table_maxn(t)
--     local mn = 0
--     for k, v in pairs(t) do
--         if mn < k then
--             mn = k
--         end
--     end
--     return mn
-- end

-- -- 两表相加操作
-- mytable = setmetatable({ 1, 2, 3 }, {
--     __add = function(mytable, newtable)
--         for i = 1, table_maxn(newtable) do
--             table.insert(mytable, table_maxn(mytable) + 1, newtable[i])
--         end
--         return mytable
--     end
-- })

-- secondtable = { 4, 5, 6 }

-- mytable = mytable + secondtable
-- for k, v in ipairs(mytable) do
--     print(k, v)
-- end

-- coroutine_test.lua 文件
-- co = coroutine.create(
--     function(i)
--         print(i);
--     end
-- )
 
-- coroutine.resume(co, 1)   -- 1
-- print(coroutine.status(co))  -- dead
 
-- print("----------")
 
-- co = coroutine.wrap(
--     function(i)
--         print(i);
--     end
-- )
 
-- co(1)
 
-- print("----------")
 
-- co2 = coroutine.create(
--     function()
--         for i=1,10 do
--             print(i)
--             if i == 3 then
--                 print(coroutine.status(co2))  --running
--                 print(coroutine.running()) --thread:XXXXXX
--             end
--             coroutine.yield()
--         end
--     end
-- )
 
-- coroutine.resume(co2) --1
-- coroutine.resume(co2) --2
-- coroutine.resume(co2) --3
 
-- print(coroutine.status(co2))   -- suspended
-- print(coroutine.running())
 
-- print("----------")

function foo (a)
    print("foo 函数输出", a)
    return coroutine.yield(2 * a) -- 返回  2*a 的值
end
 
co = coroutine.create(function (a , b)
    print("第一次协同程序执行输出", a, b) -- co-body 1 10
    local r = foo(a + 1)
     
    print("第二次协同程序执行输出", r)
    local r, s = coroutine.yield(a + b, a - b)  -- a，b的值为第一次调用协同程序时传入
     
    print("第三次协同程序执行输出", r, s)
    return b, "结束协同程序"                   -- b的值为第二次调用协同程序时传入
end)
       
print("main", coroutine.resume(co, 1, 10)) -- true, 4
print("--分割线----")
print("main", coroutine.resume(co, "r")) -- true 11 -9
print("---分割线---")
print("main", coroutine.resume(co, "x", "y")) -- true 10 end
print("---分割线---")
print("main", coroutine.resume(co, "x", "y")) -- cannot resume dead coroutine
print("---分割线---")


local newProductor

function productor()
     local i = 0
     while true do
          i = i + 1
          send(i)     -- 将生产的物品发送给消费者
     end
end

function consumer()
     while true do
          local i = receive()     -- 从生产者那里得到物品
          print(i)
     end
end

function receive()
     local status, value = coroutine.resume(newProductor)
     return value
end

function send(x)
     coroutine.yield(x)     -- x表示需要发送的值，值返回以后，就挂起该协同程序
end

-- 启动程序
newProductor = coroutine.create(productor)
consumer()